package dao;

import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
/**
 * 改进型的BaseDao，使用DBUtils框架实现通用的update和query方法；
 * query方法能将查询的结果集转换为相应的JavaBean对象和JavaBean对象集合；
 * JavaBean对象的类型由泛型参数T决定。
 * @author Steven Suo
 *
 * @param <T> 实体JavaBean类型
 */
public class BaseDao<T> {
	/**
	 * 通用的update方法，使用DBUtils的QueryRunner对象执行任何的update SQL语句。
	 * @param sql 带执行的update SQL语句
	 * @param params  SQL语句中的对应的参数，参数的个数为n，n大于等于0；
	 * @return 更新操作成功的行数
	 */
	public int update(String sql,Object...params){
		try {
			//用数据源DataSource对象来实例化QueryRunner对象，在后续的操作中就不需要使用Connection对象，具体见DBUtils框架文档。
			QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
			//执行更新操作，返回更新成功的行数。
			return queryRunner.update(sql, params);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return 0;
		}
	}
	/**
	 * 通用的query方法，使用DBUtils的QueryRunner对象执行任何的查询的SQL语句，该查询方法最多只能查询到一条记录；
	 * 如果能查询到一条记录，将转换为一个T类型的对象返回，否之则返回null；
	 * 将查询得到结果集转换为单个的JavaBean对象是用DBUtils框架中的BeanHandler类实现，无需我们处理；
	 * 但需要注意的是，能自动将结果集转换为JavaBean对象的前提是JavaBean类的成员变量名必须与对应的数据库字须同名（可忽略大小写），这中间用到了Java的反射机制。
	 * @param bHandler 将结果集合转换为单个JavaBean对象的处理器
	 * @param sql 查询语句
	 * @param params 查询语句中的参数对象
	 * @return  查询到的JavaBean对象，如果没查询到任何数据，则返回一个null。
	 */
	public T queryObject(BeanHandler<T> bHandler,String sql,Object...params) {
		try {
			QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
			//返回查询结果，如果有查询结果，结果为单个的JavaBean对象
			return queryRunner.query(sql, bHandler, params);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 通用的query方法，使用DBUtils的QueryRunner对象执行任何的查询的SQL语句，与前面的查询方法不同的是，本查询方法能查询任意多条记录，并返回相应的JavaBean对象的集合；
	 * 将查询得到结果集转换为JavaBean对象的集合是用DBUtils框架中的BeanListHandler类实现，无需我们处理；
	 * @param beanListHandler 将结果集转换为JavaBean对象集合的处理器。
	 * @param sql 查询语句。
	 * @param params 查询语句中的参数对象。
	 * @return 查询到的JavaBean对象集合，如果没查询到任何数据，则返回一个空的对象集合。
	 */
	public List<T> queryList(BeanListHandler<T> beanListHandler,String sql,Object...params) {
		try {
			QueryRunner queryRunner = new QueryRunner(DBUtils.getDataSource());
			return queryRunner.query(sql, beanListHandler, params);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
}
